/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ia_psr.fileparser;

/**
 *
 * @author Rubén Avalos Elvira y Fabiana Celiberti Tapie
 */
import ia_psr.problemas.transportes.Conductor;
import ia_psr.problemas.transportes.EmpresaTransportes;
import ia_psr.builder.GraphBuilder;
import ia_psr.builder.GrafoEmpresaTransportesBuilder;
import ia_psr.graph.Nodo;
import ia_psr.graph.Tarea;
import ia_psr.graph.Grafo;
import ia_psr.problemas.Variable;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.io.IOException;

public class PSRFileParser {
    public ArrayList<Nodo> tareaList;
    public ArrayList<Conductor> conductorList;
    public String separators = "=,;";
    private GraphBuilder builder;
    private EmpresaTransportes et;

    public void PSRFileParser() {
    }

    public void parse(String filePath) {
        try {
            if (!filePath.substring(filePath.indexOf('.')).equals(".psr")) {
                throw new Exception("El archivo debe tener extension .psr");
            }
            
            File f = new File(filePath);
            FileReader fr = new FileReader(f);
            BufferedReader br = new BufferedReader(fr);

            // Formato:
            //***********Conductores***************
            //Nombre;
            //Nombre;
            //
            //***********Tareas********************
            // Nombre=Programable,15,17;
            // Nombre=NoProgramable,3;

            String line;
            StringTokenizer st;
            Tarea t;
            Conductor c;

            tareaList = new ArrayList<Nodo>();
            conductorList = new ArrayList<Conductor>();

            // parsing de conductores
            br.readLine(); // La primera linea de cada bloque no cuenta
            while ((line = br.readLine()) != null && !line.equals("")) {
                System.out.println("Parsed line: " + line);
                st = new StringTokenizer(line, separators);
                String nombre = st.nextToken();
                c = new Conductor(nombre);
                conductorList.add(c);
            }

            // parsing de tareas
            br.readLine(); // La primera linea de cada bloque no cuenta
            while ((line = br.readLine()) != null) {
                System.out.println("Parsed line: " + line);
                st = new StringTokenizer(line, separators);
                System.out.println("Num tokens: " + st.countTokens());
                while (st.hasMoreTokens()) {

                    String nombre  = st.nextToken();
                    String tipo    = st.nextToken();
                    System.out.println("nombre: " + nombre + ", tipo: " + tipo);

                    if (tipo.toLowerCase().equals("programable")) {
                        int horaInicio = Integer.parseInt(st.nextToken());
                        int horaFin    = Integer.parseInt(st.nextToken());
                        t = new Tarea(nombre, horaInicio, 0, horaFin, 0);

                    } else if (tipo.toLowerCase().equals("noprogramable")) {
                        int duracion = Integer.parseInt(st.nextToken());
                        t = new Tarea(nombre, duracion);

                    } else {
                        throw new Exception("Formato de archivo incorrecto.");
                    }
                    
                    tareaList.add(t);

                }

            }
            builder = GrafoEmpresaTransportesBuilder.getInstance();
            builder.buildGraph(tareaList);
            et = EmpresaTransportes.getInstance();
            et.elementos.clear();
            et.addConductores(conductorList);

        } catch (IOException e) {
            System.out.println("Error: No se ha encontrado el archivo " + e.getMessage());
        } catch (Exception e) {
            System.out.println("Error: " + e.getLocalizedMessage());
        }
    }

    public void savePSR(File f) {
        try {
            // Formato:
            //***********Conductores***************
            //Nombre;
            //Nombre;
            //
            //***********Tareas********************
            // Nombre=Programable,15,17;
            // Nombre=NoProgramable,3;
            FileWriter fw = new FileWriter(f);
            BufferedWriter bw = new BufferedWriter(fw);
            
            bw.write("***********Conductores***************");
            bw.newLine();

            et = EmpresaTransportes.getInstance();
            for (Variable v : et.elementos) {
                Conductor c = (Conductor)v;
                bw.write(c.getValue() + ";");
                bw.newLine();
            }
            bw.newLine();
            ////

            bw.write("***********Tareas********************");
            bw.newLine();

            builder = GrafoEmpresaTransportesBuilder.getInstance();
            Grafo g = builder.getBuildedGraph();
            for (Nodo n : g.getNodos()) {
                Tarea t = (Tarea)n;
                // escribir tarea
                bw.write(t.nombre + "=");
                if (t.programada()) {
                    bw.write("Programable," + t.h.horaInicio + "," + t.h.horaFin + ";");
                } else {
                    bw.write("NoProgramable," + t.duracion() + ";");
                }
                bw.newLine();
            }

            bw.flush();
        } catch (Exception e) {

        }
    }

    public Grafo getParsedGraph() {
        return builder.getBuildedGraph();
    }

}
